日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ActFrameWork集成Beetlsql的Mapper功能

發布時間:2025/3/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ActFrameWork集成Beetlsql的Mapper功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

Actframework是一款讓人耳目一新的java mvc框架,簡潔的api,強大的路由深深的吸引著我。

遷移項目到act的過程中,實在是接受不了ebean的sql操作,好在國產的beetlsql正中下懷,于是將其集成到act中,方便使用。本文涉及到的內容尚未經過嚴格測試,如有不到之處還請指出。

package org.piaohao.act.beetlsql;import com.alibaba.druid.pool.DruidDataSource; import org.beetl.sql.core.*; import org.beetl.sql.core.db.DBStyle; import org.beetl.sql.core.db.MySqlStyle; import org.beetl.sql.ext.DebugInterceptor;/*** <p>Created by piaohao on 2017/3/16 0016.** @author piaohao*/ //@AutoConfig("db") public class ActBeetlsql {/*** 以下屬性使用autoconfig注入存在問題,所以寫死*/private static String driver = "com.mysql.jdbc.Driver";private static String url = "jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8";private static String userName = "root";private static String password = "root";private static SQLManager sqlManager;public static void init() {DruidDataSource ds = new DruidDataSource();ds.setUrl(url);ds.setDriverClassName(driver);ds.setUsername(userName);ds.setPassword(password);ConnectionSource source = ConnectionSourceHelper.getSingle(ds);DBStyle mysql = new MySqlStyle();// sql語句放在classpagth的/sql 目錄下SQLLoader loader = new ClasspathLoader("/sql");// 數據庫命名跟java命名一樣,所以采用DefaultNameConversion,還有一個是UnderlinedNameConversion,下劃線風格的,//UnderlinedNameConversion nc = new UnderlinedNameConversion();DefaultNameConversion nc = new DefaultNameConversion();// 最后,創建一個SQLManager,DebugInterceptor 不是必須的,但可以通過它查看sql執行情況sqlManager = new SQLManager(mysql, loader, source, nc, new Interceptor[]{new DebugInterceptor()});}public static SQLManager dao() {if (sqlManager != null)return sqlManager;else {init();if (sqlManager != null) {return sqlManager;}throw new RuntimeException("未初始化,需要調用init方法");}}} package org.piaohao.act.beetlsql;import org.beetl.sql.core.SQLManager; import org.beetl.sql.core.mapper.DefaultMapperBuilder; import org.beetl.sql.core.mapper.MapperJavaProxy; import org.osgl.inject.Module;import java.lang.reflect.Proxy; import java.util.List;public class BeetlSqlModule extends Module {@Overrideprotected void configure() {final SQLManager sqlManager = ActBeetlsql.dao();/*這個為dao接口所在包,實際可將路徑配置到properties文件*/String packageName = "com.ridersunion.h5.dao";List<Class> classList = ClassUtil.getAllClass(packageName);classList.forEach(clazz -> {registerGenericTypedBeanLoader(clazz, spec -> {Object dao = Proxy.newProxyInstance(App.class.getClassLoader(),new Class<?>[]{clazz},new MapperJavaProxy(new DefaultMapperBuilder(sqlManager), sqlManager, clazz));return dao;});});} } package org.piaohao.act.beetlsql;import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile;/*** 類相關的工具類*/ public class ClassUtil {public static void main(String[] args) throws Exception {List<Class> classes = ClassUtil.getAllClass("com.ridersunion.h5.dao");for (Class clas : classes) {System.out.println(clas.getName());}}/*** 取得某個接口下所有實現這個接口的類*/public static List<Class> getAllClassByInterface(Class c) {List<Class> returnClassList = null;if (c.isInterface()) {// 獲取當前的包名String packageName = c.getPackage().getName();// 獲取當前包下以及子包下所以的類List<Class<?>> allClass = getClasses(packageName);if (allClass != null) {returnClassList = new ArrayList<Class>();for (Class classes : allClass) {// 判斷是否是同一個接口if (c.isAssignableFrom(classes)) {// 本身不加入進去if (!c.equals(classes)) {returnClassList.add(classes);}}}}}return returnClassList;}/*** 取得某個接口下所有實現這個接口的類*/public static List<Class> getAllClass(String packageName) {List<Class> returnClassList = null;// 獲取當前包下以及子包下所以的類List<Class<?>> allClass = getClasses(packageName);if (allClass != null) {returnClassList = new ArrayList<Class>();for (Class classes : allClass) {returnClassList.add(classes);}}return returnClassList;}/* * 取得某一類所在包的所有類名 不含迭代 */public static String[] getPackageAllClassName(String classLocation, String packageName) {//將packageName分解 String[] packagePathSplit = packageName.split("[.]");String realClassLocation = classLocation;int packageLength = packagePathSplit.length;for (int i = 0; i < packageLength; i++) {realClassLocation = realClassLocation + File.separator + packagePathSplit[i];}File packeageDir = new File(realClassLocation);if (packeageDir.isDirectory()) {String[] allClassName = packeageDir.list();return allClassName;}return null;}/*** 從包package中獲取所有的Class** @return*/public static List<Class<?>> getClasses(String packageName) {//第一個class類的集合 List<Class<?>> classes = new ArrayList<Class<?>>();//是否循環迭代 boolean recursive = true;//獲取包的名字 并進行替換 String packageDirName = packageName.replace('.', '/');//定義一個枚舉的集合 并進行循環來處理這個目錄下的things Enumeration<URL> dirs;try {dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);//循環迭代下去 while (dirs.hasMoreElements()) {//獲取下一個元素 URL url = dirs.nextElement();//得到協議的名稱 String protocol = url.getProtocol();//如果是以文件的形式保存在服務器上 if ("file".equals(protocol)) {//獲取包的物理路徑 String filePath = URLDecoder.decode(url.getFile(), "UTF-8");//以文件的方式掃描整個包下的文件 并添加到集合中 findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);} else if ("jar".equals(protocol)) {//如果是jar包文件 //定義一個JarFile JarFile jar;try {//獲取jar jar = ((JarURLConnection) url.openConnection()).getJarFile();//從此jar包 得到一個枚舉類 Enumeration<JarEntry> entries = jar.entries();//同樣的進行循環迭代 while (entries.hasMoreElements()) {//獲取jar里的一個實體 可以是目錄 和一些jar包里的其他文件 如META-INF等文件 JarEntry entry = entries.nextElement();String name = entry.getName();//如果是以/開頭的 if (name.charAt(0) == '/') {//獲取后面的字符串 name = name.substring(1);}//如果前半部分和定義的包名相同 if (name.startsWith(packageDirName)) {int idx = name.lastIndexOf('/');//如果以"/"結尾 是一個包 if (idx != -1) {//獲取包名 把"/"替換成"." packageName = name.substring(0, idx).replace('/', '.');}//如果可以迭代下去 并且是一個包 if ((idx != -1) || recursive) {//如果是一個.class文件 而且不是目錄 if (name.endsWith(".class") && !entry.isDirectory()) {//去掉后面的".class" 獲取真正的類名 String className = name.substring(packageName.length() + 1, name.length() - 6);try {//添加到classes classes.add(Class.forName(packageName + '.' + className));} catch (ClassNotFoundException e) {e.printStackTrace();}}}}}} catch (IOException e) {e.printStackTrace();}}}} catch (IOException e) {e.printStackTrace();}return classes;}/*** 以文件的形式來獲取包下的所有Class** @param packageName* @param packagePath* @param recursive* @param classes*/public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive, List<Class<?>> classes) {//獲取此包的目錄 建立一個File File dir = new File(packagePath);//如果不存在或者 也不是目錄就直接返回 if (!dir.exists() || !dir.isDirectory()) {return;}//如果存在 就獲取包下的所有文件 包括目錄 File[] dirfiles = dir.listFiles(new FileFilter() {//自定義過濾規則 如果可以循環(包含子目錄) 或則是以.class結尾的文件(編譯好的java類文件)public boolean accept(File file) {return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));}});//循環所有文件 for (File file : dirfiles) {//如果是目錄 則繼續掃描 if (file.isDirectory()) {findAndAddClassesInPackageByFile(packageName + "." + file.getName(),file.getAbsolutePath(),recursive,classes);} else {//如果是java類文件 去掉后面的.class 只留下類名 String className = file.getName().substring(0, file.getName().length() - 6);try {//添加到集合中去 classes.add(Class.forName(packageName + '.' + className));} catch (ClassNotFoundException e) {e.printStackTrace();}}}} } package org.piaohao.act.beetlsql;import act.Act; import act.job.OnAppStart; import org.osgl.mvc.annotation.GetAction;/*** Hello world!*/ public class App {@GetAction("/")public String index() {return "Hello Act!";}@OnAppStartpublic static void onAppStart() {ActBeetlsql.init();}public static void main(String[] args) throws Exception {Act.start("Riders Union");} } package org.piaohao.act.beetlsql;import act.controller.Controller; import com.ridersunion.h5.dao.PlanDao; import com.ridersunion.h5.dao.UserDao; import org.osgl.mvc.annotation.GetAction; import org.osgl.util.C;import javax.inject.Inject;/*** 歡迎<br>* Created by Administrator on 2016/4/26 0026.*/ @Controller public class IndexController extends BaseController {@Injectprivate PlanDao planDao;@Injectprivate UserDao userDao;@GetAction("/dao")public void dao() {json(C.map("plan", planDao.single(1), "user", userDao.all()));}}

代碼鏈接:http://git.oschina.net/463168428/act-beetlsql

轉載于:https://my.oschina.net/piaohao/blog/863758

總結

以上是生活随笔為你收集整理的ActFrameWork集成Beetlsql的Mapper功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。